package com.nsqt.common.utils;

import com.lowagie.text.*;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.rtf.RtfWriter2;
import com.lowagie.text.rtf.style.RtfParagraphStyle;
import com.nsqt.common.domain.ColumnDO;
import com.nsqt.common.domain.TableDO;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class WordUtils {
    private Document document;
    private BaseFont bfChinese;

    public WordUtils() {
        this.document = new Document(PageSize.A4, 80, 80, 60, 70);
    }

    public Document getDocument() {
        return document;
    }

    public void setDocument(Document document) {
        this.document = document;
    }

    public BaseFont getBfChinese() {
        return bfChinese;
    }

    public void setBfChinese(BaseFont bfChinese) {
        this.bfChinese = bfChinese;
    }

    public void openDocument(String filePath) throws DocumentException, IOException {
        RtfWriter2.getInstance(this.document, new FileOutputStream(filePath));
        this.document.open();
        this.bfChinese = BaseFont.createFont("C:/WINDOWS/Fonts/DENG.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
    }

    public void insertTitle(String titleStr, int fontSize, int fontStyle, int elementAlign) throws DocumentException {
        Font titleFont = new Font(this.bfChinese, fontSize, fontStyle);
        Paragraph title = new Paragraph(titleStr);
        title.setAlignment(elementAlign);
        title.setFont(titleFont);
        this.document.add(title);

    }

    public void intertTitlePattern(String titleStr, RtfParagraphStyle rtfParagraphStyle) throws DocumentException {
        Paragraph title = new Paragraph(titleStr);
        title.setSpacingAfter(50);
        title.setFont(rtfParagraphStyle);
        this.document.add(title);
    }

    public void insertTitlePatternSecond(String titleStr, RtfParagraphStyle rtfParagraphStyle) throws DocumentException {
        Paragraph title = new Paragraph(titleStr);
        title.setFont(rtfParagraphStyle);
        title.setIndentationLeft(50);
        this.document.add(title);
    }

    public void insertContext(String contextStr, int fontSize, int fontStyle, int elementAlign) throws DocumentException {
        Font contextFont = new Font(bfChinese, fontSize, fontStyle);
        Paragraph context = new Paragraph(contextStr);
        context.setLeading(3f);
        context.setFont(contextFont);
        context.setSpacingBefore(1);
        context.setFirstLineIndent(20);
        document.add(context);
    }

    public void closeDocument() throws DocumentException {
        this.document.close();
    }

    public void generateDocument(Map<String, String> table,
                                 List<Map<String, String>> columns) {
        try {
            //表信息
            TableDO tableDO = new TableDO();
            tableDO.setTableName(table.get("tableName"));
            tableDO.setComments(table.get("tableComment"));
            //表注释转换成标题1
            String titleStr = table.get("tableComment");
            this.intertTitlePattern(titleStr, RtfParagraphStyle.STYLE_HEADING_1);
            this.insertTitlePatternSecond(titleStr + "管理", RtfParagraphStyle.STYLE_HEADING_2);
            String columnNames = "";
            //列信息
            List<ColumnDO> columsList = new ArrayList<>();
            for (Map<String, String> column : columns) {
                columnNames += column.get("columnComment");
                columnNames += "，";
            }
            StringBuffer context = new StringBuffer();
            context.append("一、在系统主菜单上找到【" + titleStr + "】目录项，选择【" + titleStr + "管理】，系统展示" + titleStr + "列表，列表信息包括" + columnNames + "，请参考下图：\n\n");
            context.append("二、添加" + titleStr + "：点击" + titleStr + "列表中的【添加】按钮，添加新的" + titleStr + "。在弹出窗口中输入" + columnNames + "等字段信息后，点击【提交】按钮，" + titleStr + "信息提交请求到后台服务，并保存到后台数据库。\n\n");
            context.append("三、编辑" + titleStr + "：在" + titleStr + "列表中选中一条记录，点击记录后面的【编辑】按钮，在弹出的" + titleStr + "编辑窗口中修改" + titleStr + "信息，然后点击【提交】按钮，" + titleStr + "信息会更新到系统数据库中。\n\n");
            context.append("四、删除" + titleStr + "：在" + titleStr + "列表中选中一条记录，点击记录后面的【删除】按钮，在弹出的" + titleStr + "删除确认窗口点击【确定】按钮，删除该" + titleStr + "。\n\n");
            context.append("五、删除多条" + titleStr + "：在" + titleStr + "列表中选中多行记录，点击列表上面的【删除】按钮；在弹出的" + titleStr + "删除确认窗口中选择【确定】按钮，可删除多条" + titleStr + "。\n\n");
            this.insertContext(context.toString(), 12, Font.NORMAL, Element.ALIGN_LEFT);


        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }


    public void generateSystem() {
        try {
            this.intertTitlePattern("基本信息管理", RtfParagraphStyle.STYLE_HEADING_1);
            this.insertTitlePatternSecond("数据字典", RtfParagraphStyle.STYLE_HEADING_2);

            StringBuffer context = new StringBuffer();
            context.append("一、在系统主菜单上找到【基本信息管理】目录项，选择【数据字典】，系统展示数据字典列表，列表信息包括标签名、数据值、类型、描述等信息，请参考下图：\n\n");
            context.append("二、添加数据字典：点击数据字典列表中的【添加】按钮，添加新的数据字典。在弹出窗口中输入签名、数据值、类型、描述等字段信息后，点击【提交】按钮，数据字典信息提交请求到后台服务，并保存到后台数据库。\n\n");
            context.append("三、编辑数据字典：在数据字典列表中选中一条记录，点击记录后面的【编辑】按钮，在弹出的数据字典编辑窗口中修改数据字典信息，然后点击【提交】按钮，数据字典信息会更新到系统数据库中。\n\n");
            context.append("四、删除数据字典：在数据字典列表中选中一条记录，点击记录后面的【删除】按钮，在弹出的数据字典删除确认窗口点击【确定】按钮，删除该数据字典。\n\n");
            context.append("五、删除多条数据字典：在数据字典列表中选中多行记录，点击列表上面的【删除】按钮；在弹出的数据字典删除确认窗口中选择【确定】按钮，可删除多条数据字典。\n\n");
            this.insertContext(context.toString(), 12, Font.NORMAL, Element.ALIGN_LEFT);

            this.insertTitlePatternSecond("文件管理", RtfParagraphStyle.STYLE_HEADING_2);
            StringBuffer context00 = new StringBuffer();
            context00.append("一、在系统主菜单上找到【基本信息管理】目录项，选择【文件管理】，系统展示文件列表，列表信息包括文件名、文件预览、上传日期等信息，请参考下图：\n\n");
            context00.append("二、添加文件：点击左上方的【上传文件】按钮，添加新的文件。在弹出窗口中选定要上传的文件，点击【提交】按钮，文件上传到服务器，文件信息保存到后台数据库。\n\n");
            context00.append("三、删除文件：在文件列表中选中一条记录，点击记录下面的【删除】按钮，在弹出的文件删除确认窗口点击【确定】按钮，删除该文件。\n\n");

            this.insertContext(context00.toString(), 12, Font.NORMAL, Element.ALIGN_LEFT);

            this.intertTitlePattern("系统管理", RtfParagraphStyle.STYLE_HEADING_1);
            this.insertTitlePatternSecond("用户管理", RtfParagraphStyle.STYLE_HEADING_2);

            StringBuffer context0 = new StringBuffer();
            context0.append("一、在系统主菜单上找到【系统管理】目录项，选择【用户管理】，系统展示用户列表，列表信息包括姓名、用户名、部门、Email等信息，请参考下图：\n\n");
            context0.append("二、添加用户：点击用户列表中的【添加】按钮，添加新的用户。在弹出窗口中输入姓名、用户名、部门、Email等字段信息后，点击【提交】按钮，用户信息提交请求到后台服务，并保存到后台数据库。\n\n");
            context0.append("三、编辑用户：在用户列表中选中一条记录，点击记录后面的【编辑】按钮，在弹出的用户编辑窗口中修改用户信息，然后点击【提交】按钮，用户信息会更新到系统数据库中。\n\n");
            context0.append("四、删除用户：在用户列表中选中一条记录，点击记录后面的【删除】按钮，在弹出的用户删除确认窗口点击【确定】按钮，删除该用户。\n\n");
            context0.append("五、删除多条用户：在用户列表中选中多行记录，点击列表上面的【删除】按钮；在弹出的用户删除确认窗口中选择【确定】按钮，可删除多条用户。\n\n");
            this.insertContext(context0.toString(), 12, Font.NORMAL, Element.ALIGN_LEFT);

            this.insertTitlePatternSecond("角色管理", RtfParagraphStyle.STYLE_HEADING_2);
            StringBuffer context1 = new StringBuffer();
            context1.append("一、在系统主菜单上找到【系统管理】目录项，选择【角色管理】，系统展示角色列表，列表信息包括角色名、备注、权限等信息，请参考下图：\n\n");
            context1.append("二、添加角色：点击角色列表中的【添加】按钮，添加新的角色。在弹出窗口中输入角色名、备注、权限等字段信息后，点击【提交】按钮，角色信息提交请求到后台服务，并保存到后台数据库。\n\n");
            context1.append("三、编辑角色：在角色列表中选中一条记录，点击记录后面的【编辑】按钮，在弹出的角色编辑窗口中修改角色信息，然后点击【提交】按钮，角色信息会更新到系统数据库中。\n\n");
            context1.append("四、删除角色：在角色列表中选中一条记录，点击记录后面的【删除】按钮，在弹出的角色删除确认窗口点击【确定】按钮，删除该角色。\n\n");
            context1.append("五、删除多条角色：在角色列表中选中多行记录，点击列表上面的【删除】按钮；在弹出的角色删除确认窗口中选择【确定】按钮，可删除多条角色。\n\n");
            this.insertContext(context1.toString(), 12, Font.NORMAL, Element.ALIGN_LEFT);

            this.insertTitlePatternSecond("部门管理", RtfParagraphStyle.STYLE_HEADING_2);
            StringBuffer context2 = new StringBuffer();
            context2.append("一、在系统主菜单上找到【系统管理】目录项，选择【部门管理】，系统展示部门列表，列表信息包括部门名称、排序、状态等信息，请参考下图：\n\n");
            context2.append("二、添加部门：点击部门列表中的【添加】按钮，添加新的部门。在弹出窗口中输入部门名称、排序、状态等字段信息后，点击【提交】按钮，部门信息提交请求到后台服务，并保存到后台数据库。\n\n");
            context2.append("三、编辑部门：在部门列表中选中一条记录，点击记录后面的【编辑】按钮，在弹出的部门编辑窗口中修改部门信息，然后点击【提交】按钮，部门信息会更新到系统数据库中。\n\n");
            context2.append("四、删除部门：在部门列表中选中一条记录，点击记录后面的【删除】按钮，在弹出的部门删除确认窗口点击【确定】按钮，删除该部门。\n\n");
            context2.append("五、删除多条部门：在部门列表中选中多行记录，点击列表上面的【删除】按钮；在弹出的部门删除确认窗口中选择【确定】按钮，可删除多条部门。\n\n");
            this.insertContext(context1.toString(), 12, Font.NORMAL, Element.ALIGN_LEFT);


        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
}

